//
//  OrganManager.h
//  Messenger
//
//  Created by OC on 15/1/15.
//  Copyright (c) 2015年 YN-APP-iOS. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "YNRecentChatObejct.h"
#import "YNContactGroup.h"
#import "YNIMFrameworkTypedef.h"
@class YNUser;
@class YNOrgTree;
@class YNTwoPeopleChat;
@class YNManyPeopleChat;

@interface YNContactManager : NSObject


//删除数据库中所有组织机构，用户，组织机构关系树
+ (BOOL)deleteAllUserAndOrgTree;


//2016-9-9jc添加，逻辑删除数据库中所有组织机构，用户，组织机构关系树
+(BOOL)logicDeleteAllUserAndOrgTree;
/**
 获取组织机构数据库数据的条数，也相当于判断其是否有数据
 
 @return 数据数
 */
+ (NSUInteger)getOrgTreeDataCountInDatabase;

//登陆成功后保存组织机构信息和登录用户信息
+ (BOOL)saveContactOrgWithOrgDictionary:(NSDictionary *)dic;

//保存群/讨论组信息
+ (BOOL)saveContactGroupWithGroupType:(int)groupType orgDictionary:(NSDictionary *)dic;

/**
 @brief 根据parentOrgNo节点查询下面的用户或部门
 
 @param parentOrgNo 组织机构的上级ID，等于0时为根节点
 @param orgType 查询组织机构类型（1：查询所有，2：查询联系人班级，3：查询组织机构下面信息）
 @param allStudent 当上一个参数为contactOrgType时用此参数 yes：查询所有班级数据 NO:查询2-行政班、3-教学班
 @param needAllCount 是否需要计算总人数
 @param needOnlinCount 是否需要计算在线人数
 @param needAllUsers 是否需要返回组织机构下的所有user对象
 @param parentOrgNoS 多个父节点一并查询的父ID字符串
 @param start 分页查询需要的开始行节点
 @param lench 分页查询需要的一次获取数据的条数
 @param countBlock 在分线程里完成总共和在线人数统计的回调
 @return 包含用户或部门的字典
 */
+ (NSDictionary *)queryContactOrgByParentOrgNo:(NSString *)parentOrgNo orgType:(OrgType)orgType getAllStudentDataS:(BOOL)allStudent needCalcuAllCount:(BOOL)needAllCount needCalcuOnlineCount:(BOOL)needOnlinCount needAllUsers:(BOOL)needAllUsers orgNoStringS:(NSString*)parentOrgNoS limitStart:(NSUInteger)start limitLength:(NSUInteger)length completeCount:(void(^)(void))countBlock;

/**
 @brief 根据parentOrgNo节点查询下面的用户或部门
 老师-联系人-学生界面   查询实习活动数据
 
 @param parentOrgNo 组织机构的上级ID，等于0时为根节点
 @param orgType 查询组织机构类型（1：查询所有，2：查询联系人班级，3：查询组织机构下面信息）
 @param needAllCount 是否需要计算总人数
 @param needOnlinCount 是否需要计算在线人数
 @param needAllUsers 是否需要返回组织机构下的所有user对象
 @param countBlock 在分线程里完成总共和在线人数统计的回调
 @return 包含用户或部门的字典
 */
+ (NSDictionary *)queryContactOrgInternshipByParentOrgNo:(NSString *)parentOrgNo orgType:(OrgType)orgType needCalcuAllCount:(BOOL)needAllCount needCalcuOnlineCount:(BOOL)needOnlinCount needAllUsers:(BOOL)needAllUsers completeCount:(void(^)(void))countBlock;

/**
 计算该组织机构里的总人数数量
 
 @param orgType 类型
 @param parentOrgNo 组织id
 @param allStudent 当 orgType为contactOrgType时有效
 @return 数量
 */
+(NSInteger)calculateOrgTotalUserNumberWithorgType:(OrgType)orgType getAllStudent:(BOOL)allStudent OrgNo:(NSString *)parentOrgNo;

/**
 *  @brief 获取所有学生信息用户
 *
 *  @return 所有学生信息用户
 */
+ (NSArray *)queryAllStudentUser;

/**
 *  @brief 获取所有老师信息用户
 *
 *  @return 所有老师信息用户
 */
+ (NSArray *)queryAllTeacherUser;

//根据gruoupName查询用户
+ (NSArray *)queryByGruoupName:(NSString *)groupName isAdmin:(BOOL)isAdmin onlyGetTeachers:(BOOL)onlyTeacher;

/**
 *  @brief  离线时清除所有用户在线状态
 *
 *  @return YES 执行成功 NO 失败
 */
+ (BOOL)clearUserOnlineStatusAtTheTimeOfOffline;

//更新用户状态
+ (BOOL)updateUserStatus:(YNUser *)user updatePcStatus:(BOOL)pcStatus updatePhoneStatus:(BOOL)phoneStatus;

//更新用户头像url
+ (BOOL)updateUserheadUrl:(YNUser *)user;

/**
 *  @brief 更新一条用户头像url
 *
 *  @param user 用户对象
 */
+ (BOOL)updateUserheadUrl:(YNUser *)user inDatabase:(FMDatabase *)db;

/**
 *  保存所有用户在线信息
 *
 *  @param userStatusArray
 */
+ (BOOL)updateAllUserStatus:(NSDictionary *)statusDic;

/**
 *  @brief  搜索联系人
 *
 *  @param  keywords 搜索关键字
 *  @param  onlyTeacher 是否只搜教师相关数据
 *  @param  orgType 搜索的组织机构类型
 *  @return 搜索结果
 */
+ (NSDictionary *)searchContactResultByKeywords:(NSString *)keywords canSearchMe:(BOOL)searchMe  onlyGetTeacherData:(BOOL)onlyTeacher orgType:(OrgType)orgType;

//查询所有群/讨论组
+ (NSArray *)queryContactGroup:(int)groupType onlyGetTeachers:(BOOL)onlyTeacher;

//查询讨论组创建者
+ (NSArray<NSString*> *)queryCreatorOfDiscussionGroup;


//更新用户信息
+ (BOOL)updateUserInformation:(YNUser *)user;

//更新群或讨论组信息
+ (BOOL)updateContactGroup:(YNContactGroup *)group;


//获取当前用户
+ (YNUser *)queryCurrentUser;

//根据用户imID查询用户
+ (YNUser *)queryUserWithUserNo:(NSString *)userNo;

//根据用户ID查询用户
+ (YNUser *)queryUserWithUserId:(NSString *)userId;

//组织机构ID判断组织机构是否存在
+ (BOOL)whetherTheOrganTreeExists:(NSString *)organNo;

// 判断群组/讨论组是否存在
+(BOOL)isContactGroupExistIn:(NSString *)groupName groupType:(int)groupType;

//查询群管理员
+ (NSArray *)queryContactGroupAdministratorByGroupName:(NSString *)groupName;

//查询用户所在组织机构
+ (YNOrgTree *)queryOrgByUserNo:(NSString *)userNo;

//遍历所有上级组织机构
+ (NSMutableArray *)queryAllParentOrgByParentOrgNo:(NSString *)parentOrgNo;

/**
 *  @brief  根据群/讨论组ID获取群/讨论组信息
 *
 *  @param groupNo   群/讨论组ID
 *  @param groupType
 *
 *  @return
 */
+ (YNContactGroup *)queryGroupByGroupNo:(NSString *)groupNo groupType:(int)groupType;

/**
 *  @brief  增量保存群/讨论组所有信息
 *
 *  @param dictionary
 *  @param groupType
 */
+ (BOOL)saveIncrementalGroupDataWithDictionary:(NSDictionary *)dictionary groupType:(int)groupType;
/**
 *  @brief 创建讨论组
 *
 *  @param group       讨论组信息
 *  @param memberArray 讨论组成员
 */
+ (BOOL)createDiscussionGroup:(YNContactGroup *)group memberArray:(NSArray *)memberArray;

/**
 *  @brief 添加群/讨论组 成员
 *
 *  @param group       讨论组信息
 *  @param memberArray 添加的讨论组成员
 */
+ (BOOL)addGroupMemberWithGroup:(YNContactGroup *)group addMemberArray:(NSArray *)memberArray;

/**
 *  @brief 解散群/讨论组
 *
 *  @param group 群/讨论组信息
 *
 *  @return YES 执行成功 NO 失败
 */
+ (BOOL)dissolveGroupByGroup:(YNContactGroup *)group;

/**
 *  @brief 踢出或离开讨论组
 *
 *  @param user  讨论组成员信息
 *  @param group 讨论组信息
 */
+ (BOOL)leaveGroupWithUser:(YNUser *)user group:(YNContactGroup *)group;


//清除聊天记录
+ (BOOL)deleteChatRecord;


/**
 *  @brief  判断群/讨论组成员是否存在
 *
 *  @param userNo    成员ID
 *  @param groupName 群/讨论组 ID
 *  @param groupType
 *
 *  @return YES ： 存在  NO ： 不存在
 */
+ (BOOL)whetherGroupOfMembers:(NSString *)userNo withGroupNo:(NSString *)groupName groupType:(int)groupType;

/**
 *  @brief 根据群/讨论组Id获取下面的用户
 *
 *  @param groupName 群/讨论组Id
 *  @param groupType 0:群 1:讨论组
 *  @param isAdmin YES 是管理员 NO不是
 *  @param onlyTeacher 只获取老师的数据
 *  @return 一个群/讨论组的成员数组
 */
+ (NSArray *)queryUserByGroupName:(NSString *)groupName isAdmin:(BOOL)isAdmin onlyGetTeachers:(BOOL)onlyTeacher;

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

#pragma mark ---------------------- 孙浪 ------------------------

#pragma mark - RecentChat Method

/**
 * @brief 保存一条会话 (插入和更新)
 *
 * @param recentChat 会话信息
 */
+ (BOOL)saveRecentChatWithMessage:(YNRecentChatObejct *)recentChat isFromRoamingSource:(BOOL)isRoaming;

/**
 2019-01 修改 查询所有最近会话消息列表数据
 
 @param db <#db description#>
 @param needScreenTop 是否需要赛选处理置顶消息
 @return 集合
 */
+ (NSArray<YNRecentChatObejct*> *)queryAllRecentChatWithNeedScreenTopChat:(BOOL)needScreenTop;

/**
 * @brief 删除会话
 * @param UserNo 要删除会话消息的用户的UserNo, 如果传进来为
 *               nil，清空数据库里所有会话消息
 */
+ (BOOL)deleteRecentChatWithRecentChatObject:(NSString *)UserNo;

/**
 *  功能: 根据ID查询一条最近会话
 *  return:一个最近会话对象
 */
+ (YNRecentChatObejct *)queryRecentChatWithFriendId:(NSString *)friendId;

/**
 根据packId获取本条消息
 
 @param packid
 @return
 */
+ (NSArray *)queryRecentChatWithPackId:(NSString *)packId;

#pragma mark - TwoPeopleChat Method

/**
 * @brief 保存一条消息到历史消息表
 *
 * @param twoPeopleChat 会话消息
 */
+ (BOOL)saveTwoPeopleChatWithMessage:(YNTwoPeopleChat *)twoPeopleChat;

/**
 * @bried 一次保存N条历史消息
 *
 * @param twoPeopleChatArray 消息数组
 */
+ (BOOL)saveMuchTwoPeopleChatWithMessage:(NSArray *)twoPeopleChatArray;


/**
 用于消息漫游判断
 查询最近多少条信息
 
 @param UserNo 聊天对方账号
 @param sendTime 这个时间之前的多少条数据，nil：最近多少条数据
 @param numberCount 查询多少条数据
 @return 返回结果
 */
+(NSArray *)queryTwoPeopleChatTopInfoWithUserNo:(NSString *)UserNo mTime:(NSString *)mTime numberCount:(NSInteger)numberCount;


/**
 用于消息漫游判断
 群、讨论组、项目组、会话查询最近多少条信息
 
 @param groupNo 群、讨论组、项目组id
 @param groupType 类型
 @param sendTime  这个时间之前的多少条数据，nil：最近多少条数据
 @param numberCount 查询多少条数据
 @return 返回结果
 */
+(NSArray *)queryManPeopleChatTopInfoWithGroupNo:(NSString *)groupNo GroupType:(int)groupType mTime:(NSString *)mTime numberCount:(NSInteger)numberCount;

/**
 用于消息漫游判断
 广播通知查询最近多少条信息
 
 @param mTime 时间
 @param numberCount 查询多少条数据
 @return
 */
+(NSArray *)queryBroadcastChatTopInfomTime:(NSString *)mTime numberCount:(NSInteger)numberCount;


/**
 * @brief 清空消息
 *
 * @param UserNo 要清空消息的用户的UserNo, 如果传进来为
 *               nil，清空所有历史消息
 */
+ (BOOL)deleteTwoPeopleChatWithUserNo:(NSString *)UserNo;

/**
 * @brief 查询两人会话历史消息
 *
 * @param UserNo 需要查询的用户的UserNo
 *        start  起始
 *        end    需要返回好多条信息(一般为20)
 */
+ (NSArray *)queryTwoPeopleChatHistoryMessageWithUserNo:(NSString *)UserNo startIndex:(NSInteger)start endIndex:(NSInteger)end;

//只返回发送成功的消息
+ (NSArray *)queryTwoPeopleChatHistoryMessageWithUserNo:(NSString *)UserNo startIndex:(NSInteger)start endIndex:(NSInteger)end isSelectSendSuccessMessage:(BOOL)selectSuccess;

/**
 查询两人会话未读第一条信息
 
 @param userNo 聊天信息id
 @param unReadCount 未读条数
 @return 返回数据
 */
+(NSArray *)queryUnReadFirstTwoPeopleChatMessageWithUserNo:(NSString *)userNo unReadCount:(NSInteger)unReadCount;

/**
 * @brief 根据关键字查询历史消息
 *
 * @param keyWords 用户输入的关键字
 **/
+ (NSArray *)queryTwoPeopleChatByKeywords:(NSString *)keyWords withUserNo:(NSString *)userNo;

#pragma mark - ManyPeopleChat Method

/**
 * @brief 保存一条消息到多人历史消息表
 *
 * @param manyPeopleChat 需要保存的消息对象
 * @param groupType      判断是群消息还是讨论组消息
 **/
+ (BOOL)saverManyPeopleChatWithMesage:(YNManyPeopleChat *)manyPeopleChat groupType:(int)groupType;

/**
 * @brief 清空消息
 *
 * @param GroupNo   需要清空消息的群或讨论组的GroupNo,如果为NIL，清空所有消息
 *        groupType 判断是群消息还是讨论组消息
 **/
+ (BOOL)deleteManyPeopleChatWithGroupNo:(NSString *)GroupNo groupType:(int)groupType;

/**
 * @brief 查询多人会话历史消息
 *
 * @param GroupNo   根据GroupNo查询消息
 *        groupType 判断是群消息还是讨论组消息
 *        start     起始
 *        end       需要返回好多条信息(一般为20)
 **/
+ (NSArray *)queryManyPeopleChatHistoryMessageWithGroupNo:(NSString *)GroupNo groupType:(int)groupType startIndex:(NSInteger)start endIndex:(NSInteger)end;

+ (NSArray *)queryManyPeopleChatHistoryMessageWithGroupNo:(NSString *)GroupNo groupType:(int)groupType startIndex:(NSInteger)start endIndex:(NSInteger)end isSelectSendSuccessMessage:(BOOL)selectSuccess;

/**
 查询多人对话未读消息的第一条消息
 
 @param GroupNo 当前聊天所在的讨论组/项目组或群的ID
 @param groupType 类型
 @param unReadCount 未读消息条数
 @return 返回数据
 */
+ (NSArray *)queryUnReadFirstManyPeopleChatGroupNo:(NSString *)GroupNo groupType:(int)groupType unReadCount:(NSInteger)unReadCount;

/**
 * @brief 根据关键字查询历史消息
 *
 * @param keyWords  用户输入的关键字
 *        groupType 判断是群消息还是讨论组消息
 **/
+ (NSArray *)queryManyPeopleChatByKeywords:(NSString *)keyWords groupNo:(NSString *)groupNo groupType:(int)groupType;

/**
 查询艾特@数据
 2018-11-16 JC添加
 @param groupType
 @param groupNo
 @return 返回结果
 */
+ (NSArray *)queryManyPeopleChatAitWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;

/**
 根据groupNo查询该条信息
 2019-1-30 JC添加
 @param groupType
 @param groupNo
 @return 返回结果
 */
+ (NSArray *)queryManyPeopleChatWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;

/**
 查询艾特@个人或艾特@所有人，离最新一条数据共有多少条数据
 2018-11-16 JC添加
 
 @param groupType
 @param groupNo
 @param aitContactMark 1：艾特@自己，2：艾特所有人
 @return 返回结果
 */
+ (NSInteger)queryManyPeopleChatAitCountWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo ynmanyPeopleChat:(YNManyPeopleChat*)ynmanyPeopleChat;

/**
 修改艾特@数据为默认0的数据
 2018-11-16 JC添加
 @param groupType
 @param groupNo
 */
+ (BOOL)updateManyPeopleChatAitWithGroupTyoe:(int)groupType groupNo:(NSString *)groupNo;


#pragma mark - 根据id获取名字
/**
 * @brief 根据id获取名字
 **/
+ (id)queryUserNameByUserID:(NSString *)userID chatType:(int)chatType;

#pragma mark - 保存同步下来的会话列表
/**
 * 将同步下来的会话列表保存到数据库
 * pram: array
 */
+ (BOOL)saveSessionListWithInfo:(NSArray *)infos;

/**
 解析和保存拉取到的漫游消息
 
 @param infos 消息数组
 @param isNewListPullData YES:消息列表拉取最新消息漫游
 @return 结果
 */
+ (BOOL)parsingAndSaveRoamMessageWithInfo:(NSArray *)infos isMessageListData:(BOOL)isMessageListData isNewListPullData:(BOOL)isNewListPullData;

/**
 *  @brief 根据parentOrgNo获取组织机构
 *
 *  @param parentOrgNo 父节点
 *
 *  @return 结果按照ordId降序排列
 */
+ (NSArray *)queryOrgTreeByParentOrgNo:(NSString *)parentOrgNo;

/**
 根据userNo获取本条消息
 
 @param userNo
 @return
 */
+ (NSArray *)queryRecentChatWithUserNo:(NSString *)userNo;


/**
 查询会话人的消息记录里时间最早的时间
 黄旭 2017-12-5
 @param userNo 用户id
 @param db 数据库对象
 @return 时间字符串
 */
+ (NSString*)queryMinTimeByTwoPeopleChatWithUserNo:(NSString*)userNO;

//根据userNo查询本条信息
+ (NSArray*)queryTwoPeopleChatWithUserNo:(NSString*)userNO;

/**HX** 将userNo未读消息的未读数做加一或减一的更新 **/
+ (BOOL)updateUserUnreadCountByOneWithUserNo:(NSString*)UserNo isAddOne:(BOOL)addOne;
/**
 *  @brief  根据组织机构ID查询下面的所有user对象
 *
 *  @param orgNo   组织机构ID
 *
 *  noTeacher 是否不包含老师
 *  
 *  @return YNUser数据数组
 */
+ (NSArray<YNUser*>*)queryAllUsersByOrgNos:(NSString *)orgNos isNoTeacher:(BOOL)noTeacher;

/**
 查询自己在群组里的角色（是否是管理员）
 
 @param groupType
 @return 结果集
 */
+ (NSArray<NSDictionary*> *)queryMyGroupRoleWithGroupId:(NSString*)groupId;
/**
 删除最近会话列表里的所有系统和通知消息
 
 @return
 */
+ (BOOL)deleteRecentSystemAndInformChat;
@end
